class AsyncSeriesWaterfallHook { // 钩子是同步的
  constructor(args) { // agrs => ['name']
    this.tasks = []
  }
  tapAsync(name, task) {
    this.tasks.push(task)
  }
  callAsync(...args) {
    let finalcallback = args.pop()
    let index = 0
    let next = (err, data) => {
      let task = this.tasks[index]
      if(!task) return finalcallback()
      if(index === 0) {
        task(...args, next)
      }else{
        task(data, next)
      }
      index++
    }
    next()
  }
}

let hook = new AsyncSeriesWaterfallHook(['name'])
hook.tapAsync('react', function(name, cb) {
    setTimeout(()=> {
      console.log('react', name)
      cb(null, 'react-data')
    }, 1000)
})
hook.tapAsync('node', function(data, cb) {
    setTimeout(()=> {
      console.log('node', data)
      cb(null, 'node-data')
    }, 10)
})
hook.tapAsync('webpack', function(data, cb) {
    setTimeout(()=> {
      console.log('webpack-data', data)
      cb()
    }, 2000)
})
// hook.call('hl2')
hook.callAsync(['hl1', 'hl2'], (data) => {
  console.log(data)
  console.log('end')
})

//  AsyncParallelBailHook() 带保险的异步并发的钩子
